/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package ServidorRMI;

import ClasesDominio.*;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
import java.util.*;

/**
 *
 * @author Kleyvert
 */
public class ImplementadorRMI extends UnicastRemoteObject
	implements InterfaceRMI {
    public static Coordinador coordinador = new Coordinador();

     public ImplementadorRMI() throws RemoteException {
            super();
     }

     public int BuscarNodoVecino(int idNodoActual) throws RemoteException{
         int puertoNodo = 0;

         for (int i = 0; i < coordinador.getCliente().size();i++){
             if (idNodoActual == coordinador.getCliente().get(i).getPuertoID()){
                 puertoNodo = coordinador.getCliente().get(i-1).getPuertoID();
             }
         }
         return puertoNodo;
     }
     public ArrayList<Cliente> BuscarListaNodosVecinos(int idNodoActual) throws RemoteException{
         // retornamos la lista de cliente contenida en la clase coordinador
         return coordinador.getCliente();
     }

     public int ConsultarUltimoIDPuerto() throws RemoteException{
         int ultimoValor = 0;

         for (int i = 0; i < coordinador.getCliente().size();i++){
             if (i == coordinador.getCliente().size()-1){
                 ultimoValor = coordinador.getCliente().get(i).getPuertoID();
             }
         }

         return ultimoValor;
     }


     public int InsertarCliente(Cliente cliente) throws RemoteException{
         int idCliente = 0;
         int resultado = 0;
         idCliente = cliente.getID();
         // verificamos
         if ( idCliente == 1 ){
              cliente.setPuertoID(1100);
              
              // Seteamos el atributo del tipo coordinador para
              // asignarle el ROL de COORDINADOR a un determinado cliente
              cliente.setCoordinador(coordinador);
              // guardamos a ese cliente con el rol de coordinador en la lista de clientes
              coordinador.getCliente().add(cliente);             
              System.out.println("Nombre del coordinador: "+ cliente.getNombre());                       
         }
         else
         {
           if ( idCliente!= 1 ){
               cliente.setPuertoID(idCliente);
               coordinador.getCliente().add(cliente);
               System.out.println("Nombre del cliente: "+ cliente.getNombre());
           }
         }
         resultado = cliente.getPuertoID();
         return resultado;
     }

  // implementacion del metodo para gestionar los archivos enviados por los clientes
  public String EnviarArchivoServidor(Archivo archivo, int puertoIDCliente) throws RemoteException{
     String mensajeConfirmacion = "";

          if (archivo!= null)
          {
              int ultimoValor = 0;

              for (int i = 0; i < coordinador.getCliente().size();i++){
                  // Verificamos que el cliente este en la lista del coordinador
                   if (puertoIDCliente == coordinador.getCliente().get(i).getPuertoID()){
                       // si conseguimos al cliente se inserta en ese cliente
                       // el archivo que envio por la interfaz de comunicacion
                       // con el servidor principal al coordinador actual
                       coordinador.getCliente().get(i).getListaArchivo().add(archivo);
                       // seteamos la variable mensajeConfirmacion para que devuelva
                       // un valor positivo
                       mensajeConfirmacion = "El archivo fue enviado y procesado con exito";
                       System.out.println(mensajeConfirmacion);
                   }
              }
              
          }
          else{
              mensajeConfirmacion = "El archivo no pudo ser procesado";
          }

      return mensajeConfirmacion;
  }

     public String BuscarCoordinadorActual() throws RemoteException{
         String nombreCoordinador = "";
         // recorremos la lista del anillo
         for (int i = 0; i < coordinador.getCliente().size();i++){
             // verificamos que atributo del tipo coordinador sea distinto a null
             if (coordinador.getCliente().get(i).getCoordinador() != null){
                 nombreCoordinador = coordinador.getCliente().get(i).getNombre();
             }
         }
         return nombreCoordinador;
     }
     

}
